package com.menu.system.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.menu.common.core.domain.AjaxResult;
import com.menu.system.domain.MenuPublicattributeData;
import com.menu.system.domain.MenuPublicattributeType;
import com.menu.system.domain.vo.OrderVo;
import com.menu.system.mapper.MenuProductBasicattributeMapper;
import com.menu.system.mapper.MenuPublicattributeDataMapper;
import com.menu.system.mapper.MenuPublicattributeTypeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.menu.system.mapper.MenuProductTypetemplateMapper;
import com.menu.system.domain.MenuProductTypetemplate;
import com.menu.system.service.IMenuProductTypetemplateService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 产品类型模板Service业务层处理
 *
 * @author ruoyi
 * @date 2024-07-08
 */
@Service
public class MenuProductTypetemplateServiceImpl implements IMenuProductTypetemplateService
{
    @Autowired
    private MenuProductTypetemplateMapper menuProductTypetemplateMapper;
    @Autowired
    private MenuPublicattributeTypeMapper menuPublicattributeTypeMapper;
    @Autowired
    private MenuPublicattributeDataMapper menuPublicattributeDataMapper;

    @Autowired
    private MenuProductBasicattributeMapper menuProductBasicattributeMapper;
    /**
     * 查询产品类型模板
     *
     * @param protypeId 产品类型模板主键
     * @return 产品类型模板
     */
    @Override
    public List<MenuProductTypetemplate> selectMenuProductTypetemplateByProtypeId(Long protypeId)
    {
        return menuProductTypetemplateMapper.selectMenuProductTypetemplateByProtypeId(protypeId);
    }

    /**
     * 查询产品类型模板列表
     *
     * @param menuProductTypetemplate 产品类型模板
     * @return 产品类型模板
     */
    @Override
    public List<MenuProductTypetemplate> selectMenuProductTypetemplateList(MenuProductTypetemplate menuProductTypetemplate)
    {
        return menuProductTypetemplateMapper.selectMenuProductTypetemplateList(menuProductTypetemplate);
    }


        @Override
        public AjaxResult typetemplateList(Long protypeId) {
            AjaxResult ajaxResult=new AjaxResult();
            List<MenuPublicattributeType> menuPublicattributeTypes = menuPublicattributeTypeMapper.typetemplateList(protypeId);
            menuPublicattributeTypes.forEach(
                    menuProductsAttribute -> {
                        MenuPublicattributeData menuPublicattributeData=new MenuPublicattributeData();
                        menuPublicattributeData.setPublicattributeType(menuProductsAttribute.getPublicattributeType());
                        menuProductsAttribute.setMenuPublicattributeDatas(menuPublicattributeDataMapper.findMenuPublicattributeDataList(menuPublicattributeData));
                    }
            );
            ajaxResult.put("publicAttribute",menuPublicattributeTypes);
            ajaxResult.put("basicAttribute",menuProductBasicattributeMapper.typetemplateList(protypeId));

            return ajaxResult;


    }

    /**
     * 新增产品类型模板
     *
     * @param menuProductTypetemplate 产品类型模板
     * @return 结果
     */
    @Override
    @Transactional
    public int insertMenuProductTypetemplate(MenuProductTypetemplate menuProductTypetemplate)
    {


        batchProductTypetemplateByProtypeIds(menuProductTypetemplate);
        batchpublicattributeId(menuProductTypetemplate);
        return 1;


    }

    /**
     * 修改产品类型模板
     *
     * @param menuProductTypetemplate 产品类型模板
     * @return 结果
     */
    @Override
    @Transactional
    public int updateMenuProductTypetemplate(MenuProductTypetemplate menuProductTypetemplate)
    {
        menuProductTypetemplateMapper.deleteMenuProductTypetemplateByProtypeId(menuProductTypetemplate.getProtypeId());

        batchProductTypetemplateByProtypeIds(menuProductTypetemplate);
        if(menuProductTypetemplate.getPublicattributeIds().length!=0){
            menuProductTypetemplateMapper.deletemenuproductTypetemplatepublic(menuProductTypetemplate.getProtypeId());
            batchpublicattributeId(menuProductTypetemplate);
        }

        return 1;
    }

    /**
     * 批量删除产品类型模板
     *
     * @param protypeIds 需要删除的产品类型模板主键
     * @return 结果
     */
    @Override
    public int deleteMenuProductTypetemplateByProtypeIds(Long[] protypeIds)
    {
        return menuProductTypetemplateMapper.deleteMenuProductTypetemplateByProtypeIds(protypeIds);
    }

    /**
     * 删除产品类型模板信息
     *
     * @param protypeId 产品类型模板主键
     * @return 结果
     */
    @Override
    public int deleteMenuProductTypetemplateByProtypeId(Long protypeId)
    {
        return menuProductTypetemplateMapper.deleteMenuProductTypetemplateByProtypeId(protypeId);
    }

    @Override
    public List<Long> findPublicProperty(Long protypeId) {
        return menuProductTypetemplateMapper.findPublicProperty(protypeId);
    }

    @Override
    public List<OrderVo> selectMenuProductTypetemplateOrderVo(Long protypeId) {
        return menuProductTypetemplateMapper.selectMenuProductTypetemplateOrderVo(protypeId);
    }

    @Override
    public List<OrderVo> selectMenuPublicrderVo(Long protypeId) {
        return menuProductTypetemplateMapper.selectMenuPublicrderVo(protypeId);
    }

    @Override
    @Transactional
    public int updateMenuProductTypetemplateOrder(List<OrderVo> orderVos) {

        Map<Long, List<OrderVo>> collect = orderVos.stream().collect(Collectors.groupingBy(OrderVo::getIsPublic));

        collect.get(0L).forEach(
                orderVo -> {
                    if(menuProductTypetemplateMapper.updateMenuProductTypetemplateOrder(orderVo)<1){
                        throw new RuntimeException("更新失败");
                    }

                }
        );

        collect.get(1L).forEach(
                orderVo -> {
                    if(menuProductTypetemplateMapper.updateMenuProductTypetemplateOrderPublic(orderVo)<1){
                        throw new RuntimeException("更新失败");
                    }

                }
        );


        return 1;
    }

    public  void  batchProductTypetemplateByProtypeIds(MenuProductTypetemplate menuProductTypetemplate){

        List<MenuProductTypetemplate>  menuProductTypetemplates=new ArrayList<>();
        for (Long basicattributeId : menuProductTypetemplate.getBasicattributeIds()) {
            MenuProductTypetemplate menuProductTypetemplate1=new MenuProductTypetemplate();
            menuProductTypetemplate1.setBasicattributeId(basicattributeId);
            menuProductTypetemplate1.setProtypeId(menuProductTypetemplate.getProtypeId());
            menuProductTypetemplates.add(menuProductTypetemplate1);
        }
        menuProductTypetemplateMapper.batchProductTypetemplateByProtypeIds(menuProductTypetemplates);

    }

    public  void  batchpublicattributeId(MenuProductTypetemplate menuProductTypetemplate){

        List<MenuProductTypetemplate>  menuProductTypetemplates=new ArrayList<>();
        for (Long publicattributeId : menuProductTypetemplate.getPublicattributeIds()) {
            MenuProductTypetemplate menuProductTypetemplate1=new MenuProductTypetemplate();
            menuProductTypetemplate1.setPublicattributeId(publicattributeId);
            menuProductTypetemplate1.setProtypeId(menuProductTypetemplate.getProtypeId());
            menuProductTypetemplates.add(menuProductTypetemplate1);
        }
        menuProductTypetemplateMapper.batchpublicattributeId(menuProductTypetemplates);

    }
}
